echo -e "\033[34m #################################################\033[0m"
echo -e "\033[34m ##   author：侯勇                              ##\033[0m"
echo -e "\033[34m ##   mail：yhouwork@163.com                    ##\033[0m"
echo -e "\033[34m ##   Linux version：  Cent OS7                 ##\033[0m"
echo -e "\033[34m ##   redis version ： 5.0.4                    ##\033[0m"
echo -e "\033[34m ##   date ：2019/4/14                          ##\033[0m"
echo -e "\033[34m ##   ps ：redis单机或集群部署                  ##\033[0m"
echo -e "\033[34m #################################################\033[0m"
cd /;
yum -y install  wget;
if [ ! -d "/usr/local" ];
 then
 mkdir -p /usr/local
 fi
cd usr/local;
echo -e "\033[34m =================》文件夹end《=================  \033[0m"

#下载安装包
if [ ! -e "/app/redis-5.0.4.tar.gz" ]; 
 then
    #wget http://download.redis.io/releases/redis-5.0.4.tar.gz;
    if [ ! -d   "/app"  ];
        then
        mkdir /app
    fi
    cd /app;
    echo -e "\033[34m 下载安装包  \033[0m"
    wget http://download.redis.io/releases/redis-5.0.4.tar.gz;
    cd -;
 fi
yum -y install gcc;


cp /app/redis-5.0.4.tar.gz .
#解压安装包
echo -e "\033[34m =================》解压文件  start《=================  \033[0m"
tar -zxvf redis-5.0.4.tar.gz;
rm -f redis-5.0.4.tar.gz;
echo -e "\033[34m =================》解压完成  end 《=================  \033[0m"

#重命名
mv redis-5.0.4 redis

#编译
echo -e "\033[34m =================》编译 start《=================  \033[0m"
cd redis ;
make;
cd src;
make install;

echo -e "\033[34m =================》编译 end《=================  \033[0m"

ip=$(ip a show dev ens33|grep -w inet|awk '{print $2}'|sed 's/\/.*//');

#########################函数 start##########################
## 修改配置文件  $1 : 修改redis配置文件位置   $2 : redis.id  $3 : pid 文件位置
editRedisConf(){
    num=0;
    numa=0;
    nullnum=;

    #获取bind所在行  redis启动ip
    num=$(grep -n 'bind\ 127\.0\.0\.1'  $1| awk -F ':' '{print $1}')

    if  [  !  "$num" = ""    ] ;then
        echo -e "\033[34m =================》bind此变量是存在的 进行修改  $num   $ip 《=================  \033[0m"
        #此变量是存在的 进行修改
        sed -i 's/bind\ 127\.0\.0\.1/bind\ '$ip'/g' $1
        num=$nullnum;
    fi 

    #获取prot所在行 redis 端口
    num=$(grep -n 'port\ 6379'  $1| awk -F ':' '{print $1}')

    if  [  !  "$num" = ""    ] ;then
        echo -e "\033[34m =================》prot此变量是存在的 进行修改  $num   $ip 《=================  \033[0m"
        #此变量是存在的 进行修改
        sed -i 's/port\ 6379/port\ '$2'/g' $1
        num=$nullnum;
    fi 

    #获取daemonize所在行 后台启动
    num=$(grep -n 'daemonize\ no'  $1| awk -F ':' '{print $1}')

    if  [  !  "$num" = ""    ] ;then
        echo -e "\033[34m =================》daemonize此变量是存在的 进行修改  $num   $ip 《=================  \033[0m"
        #此变量是存在的 进行修改
        sed -i 's/daemonize\ no/daemonize\ yes/g' $1
        num=$nullnum;
    fi 
    
    #获取pidfile所在行 启动id文件
    num=$(grep -n 'pidfile'  $1| awk -F ':' '{print $1}')

    pidfile=$3;
    pidfile=${pidfile//\//\\/};
    pidfile=${pidfile//\./\\.};
    
    if  [  !  "$num" = ""    ] ;then
        echo -e "\033[34m =================》pidfile此变量是存在的 进行修改  $num   $ip 《=================  \033[0m"
        #此变量是存在的 进行修改
        sed -i 's/pidfile.*/pidfile\ '$pidfile'/g' $1
        num=$nullnum;
    fi 
    
    #获取appendonly所在行 aof日志开启&nbsp; 有需要就开启，它会每次写操作都记录一条日志
    num=$(grep -n 'appendonly\ no'  $1| awk -F ':' '{print $1}')

    if  [  !  "$num" = ""    ] ;then
        echo -e "\033[34m =================》appendonly此变量是存在的 进行修改  $num   $ip 《=================  \033[0m"
        #此变量是存在的 进行修改
        sed -i 's/appendonly\ no/appendonly\ yes/g' $1
        num=$nullnum;
    fi 

    #获取acluster-enabled yes所在行 开启集群服务
    num=$(grep -n 'cluster\-enabled\ yes'  $1| awk -F ':' '{print $1}')

    if  [  !  "$num" = ""    ] ;then
        echo -e "\033[34m =================》cluster-enabled此变量是存在的 进行修改  $num   $ip 《=================  \033[0m"
        #此变量是存在的 进行修改
        sed -i 's/.*cluster\-enabled\ yes/cluster\-enabled\ yes/g' $1
        num=$nullnum;
    fi 
    
    #获取cluster-config-file所在行 服务启动后会自动生成这个文件（不可重复）
    num=$(grep -n 'cluster\-config\-file'  $1| awk -F ':' '{print $1}')

    if  [  !  "$num" = ""    ] ;then
        echo -e "\033[34m =================》cluster-config-file此变量是存在的 进行修改  $num   $ip 《=================  \033[0m"
        #此变量是存在的 进行修改
        sed -i 's/.*cluster\-config\-file.*/cluster\-config\-file\ nodes\-'$2'.conf/g' $1
        num=$nullnum;
    fi 

    #获取cluster-node-timeout所在行 开启集群服务
    num=$(grep -n 'cluster\-node\-timeout'  $1| awk -F ':' '{print $1}')

    if  [  !  "$num" = ""    ] ;then
        echo -e "\033[34m =================》cluster-node-timeout此变量是存在的 进行修改  $num   $ip 《=================  \033[0m"
        #此变量是存在的 进行修改
        sed -i 's/.*cluster\-node\-timeout/cluster\-node\-timeout/g' $1
        num=$nullnum;
    fi

}
#单机部署函数  $1  :  端口    $2 : 文件名
singleInstall(){
    echo -e "\033[34m =================》单机部署 start《=================  \033[0m"
    mkdir    /usr/local/$2/bin
    mkdir    /usr/local/$2/conf
    
    echo $1 >/usr/local/$2/conf/redis.pid
    
    cd  /usr/local/$2/src/
    #将命令都放到bin目录下
    mv  redis-benchmark redis-check-aof  redis-cli redis-server /usr/local/$2/bin
    mv  /usr/local/$2/redis.conf  /usr/local/$2/conf/
    
    editRedisConf  /usr/local/$2/conf/redis.conf  $1  /usr/local/$2/conf/redis.pid  

    echo -e "\033[34m =================》单机部署 end《=================  \033[0m"
}
#集群部署函数
clusterInstall(){
    echo -e "\033[34m =================》集群部署 start《=================  \033[0m"
    yum -y install ruby ruby-devel rubygems rpm-build
    gem install redis

    for (( i = 1; i < 7; i++ ));do
        
        port=700$i
        filename=redis$port
        cp -R /usr/local/redis /usr/local/$filename
        singleInstall $port  $filename
    done
    
    rm -rf /usr/local/redis

    echo -e "\033[34m =================》集群部署 start《=================  \033[0m"
}
#启动单机reids $1 : 文件名
startSingle(){
    redis-server   /usr/local/$1/conf/redis.conf
}
#启动单机reids
startCluster(){
    clusterServer=;
    for (( i = 1; i < 7; i++ ));do

        port=700$i
        filename=redis$port
        startSingle  $filename
        clusterServer=$clusterServer" "$ip":"$port 

    done

    redis-cli --cluster create  $clusterServer  --cluster-replicas 1

}

#########################函数 end##########################

echo -e " 请选择部署方式（1:单机/2:集群）： "
read input

if  [  "$input"x   =   "2"x  ]  ; then
    clusterInstall
    else
    read prot
    singleInstall $prot redis
fi
echo -e "\033[34m =================》redis 部署完毕 《=================  \033[0m"
echo -e " 是否直接启动redis（yes/no）： "
read isStart
if  [  "$isStart"x   =   "yes"x  ]  ; then
   if  [  "$input"x   =   "2"x  ]  ; then
       #启动集群redis
       startCluster
       else
       #启动单机reids
       startSingle redis
   fi
   else
   if  [  "$input"x   =   "2"x  ]  ; then
       clusterServer=;
       #启动集群redis
       for (( i = 1; i < 7; i++ ));do

           port=700$i
           filename=redis$port
           echo -e "单机启动redis 命令:redis-server   /usr/local/"$filename"/conf/redis.conf "
           clusterServer=$clusterServer" "$ip":"$port
       done
       echo -e "redis集群启动 命令:redis-cli --cluster create  "$clusterServer"  --cluster-replicas 1 "
       else
       #启动单机reids
       echo -e "单机启动redis 命令:redis-server   /usr/local/redis/conf/redis.conf "
   fi
fi


